package com.cloud.point.jvm;

/**
 * 类的初始化
 *
 * @author 24373
 * @version 1.0
 * @date 2024-06-10 22:40
 */
public class TestInitClass {

    static {
        System.out.println("main init");
    }

    public static void main(String[] args) throws ClassNotFoundException {
        /**
         * 1. 静态常量（基本类型和字符串）不会触发初始化
         */
        System.out.println(B.b);
        /**
         * 2. 类对象.class 不会触发初始化
         */
        //System.out.println(B.class);
        /**
         * 3. 创建该类的数组不会触发初始化
         */
        //System.out.println(new B[0]);
        /**
         * 4. 不会初始化类 B，但会加载 B、A
         *  loadClass只是获取了类的信息，并没有初始化类
         */
        //获取线程的上下文类加载器；线程启动时，由jvm赋值，默认是应用程序类加载器
        //ClassLoader cl = Thread.currentThread().getContextClassLoader();
        //cl.loadClass("com.cloud.point.jvm.B");
        /**
         * 5. 不会初始化类 B，但会加载 B、A
         */
        //ClassLoader c2 = Thread.currentThread().getContextClassLoader();
        //Class.forName("com.cloud.point.jvm.B", false, c2);

        //以下会初始化类
        /**
         * 1. 首次访问这个类的静态变量或静态方法时
         */
        //System.out.println(A.a);
        /**
         * 2. 子类初始化，如果父类还没初始化，会引发
         */
        //System.out.println(B.j);
        /**
         * 3. 子类访问父类静态变量，只触发父类初始化
         */
        //System.out.println(B.a);
        /**
         * 4. 会初始化类 B，并先初始化类 A
         */
        //Class.forName("com.cloud.point.jvm.B");
    }

}

class A {
    static int a = 0;

    static {
        System.out.println("A init");
    }
}

class B extends A {
    final static double b = 3.14;
    static int j = 0;

    static {
        System.out.println("B init");
    }
}
